#pragma once


#include "xvector.h"
#include "xlist.h"

template <typename T1,typename T2>
class xpair;

template <typename T1,typename T2>
class xpairlist;



template<typename T1,typename T2>
class xchainedmap;

template<typename T1,typename T2>
class _xchainedmap_const_iterator
{
public: 
	_xchainedmap_const_iterator(XUINT32 slotIndex, class _xlist_iterator<xpair<T1,T2> > slotIterator, xchainedmap<T1,T2> * container)
	{
		NOTIMPL
	}

	_xchainedmap_const_iterator()
	{
		NOTIMPL
	}

	const xpair<T1,T2> & operator*() const
	{
		NOTIMPL
	}

	const xpair<T1,T2> * operator->()
	{
		NOTIMPL
	}

	_xchainedmap_const_iterator<T1,T2> operator++(XINT32)
	{
		NOTIMPL
	}

	_xchainedmap_const_iterator<T1,T2> & operator++()
	{
		NOTIMPL
	}

	XUINT32 operator==(const _xchainedmap_const_iterator<T1,T2> & rhs) const
	{
		NOTIMPL
	}

	XUINT32 operator!=(const _xchainedmap_const_iterator<T1,T2> & rhs) const
	{
		NOTIMPL
	}

	_xchainedmap_const_iterator<T1,T2> & operator=(const _xchainedmap_const_iterator<T1,T2> &)
	{
		NOTIMPL
	}

protected: 
	XUINT32 m_SlotIndex;
	_xlist_iterator<xpair<T1,T2>> m_SlotIterator;
	xchainedmap<T1,T2> * m_Container;
};


template<typename T1,typename T2>
class _xchainedmap_iterator :
	public _xchainedmap_const_iterator<T1,T2>
{
public: 
	_xchainedmap_iterator(XUINT32 slotIndex, class _xlist_iterator<xpair<T1,T2> > slotIterator, xchainedmap<T1,T2> * container)
	{
		NOTIMPL
	}

	xpair<T1,T2> & operator*()
	{
		NOTIMPL
	}

	xpair<T1,T2> * operator->()
	{
		NOTIMPL
	}

	_xchainedmap_iterator<T1,T2> operator++(XINT32)
	{
		NOTIMPL
	}

	_xchainedmap_iterator<T1,T2> & operator++()
	{
		NOTIMPL
	}
};


template<typename T1,typename T2>
class xchainedmap
{
	//class xpairlist<T1,T2>
private: 
	xchainedmap<T1,T2> & operator=(const xchainedmap<T1,T2> &)
	{
		NOTIMPL
	}

public: 
	xchainedmap(XUINT32 startingSize)
	{
		NOTIMPL
	}

private: 
	xchainedmap(const xchainedmap<T1,T2> &)
	{
		NOTIMPL
	}

public: 

	typedef typename _xchainedmap_iterator<T1,T2> iterator;
	typedef typename _xchainedmap_const_iterator<T1,T2> const_iterator;

	//class xpair<T1,T2>

	static const XUINT32 DefaultTableSize;
	const_iterator begin() const
	{
		NOTIMPL
	}

	iterator begin()
	{
		NOTIMPL
	}

	const_iterator end() const
	{
		NOTIMPL
	}

	iterator end()
	{
		NOTIMPL
	}

	~xchainedmap()
	{
		NOTIMPL
	}

	void Clear()
	{
		NOTIMPL
	}

	HRESULT Add(T1 const & key, T2 const & data)
	{
		NOTIMPL
	}

	HRESULT Get(T1 const &, T2 &)
	{
		NOTIMPL
	}

	XUINT32 ContainsKey(T1 const &)
	{
		NOTIMPL
	}

	HRESULT Remove(T1 const &, xpair<T1,T2> &)
	{
		NOTIMPL
	}

	HRESULT Remove(T1 const &, T2 &)
	{
		NOTIMPL
	}

	XUINT32 Count()
	{
		NOTIMPL
	}

private: 
	XUINT32 CalculateTruncatedHash(T1 key) const
	{
		NOTIMPL
	}

	XUINT32 ActualHashSize() const
	{
		NOTIMPL
	}

	xvector<xpairlist<T1,T2> *> m_table;
	XUINT32 m_count;
};

